/* 以下是伪代码 */

/* 方法1： 大量的if or switch-case */

/* 方法2：通过状态转移表驱动 */

/* 方法3：面向对象法设计状态机 */
//最初版-V1

enum {LOCKED,UNLOCKED};/*枚举各个状态*/

/*定义闸机类*/
typedef struct _turnstile
{
    int state;
    void (*card)(struct _turnstile *p_this);
    void (*pass)(struct _turnstile *p_this);
}turnstile_t;

/* 闸机 card 事件 */
void turnstile_card(turnstile_t *p_this)
{
    if (p_this->state == LOCKED)
    {
        /* 切换至解锁状态 */
        /* 执行unlock动作,调用 unlock 函数 */
    }
    else
    {
        /* 执行 thank you 动作,调用 thank you 函数 */
    }
}

/* 闸机 pass 事件*/
void turnstile_pass(turnstile_t *p_this)
{
    if (p_this->state == LOCKED)
    {
        /* 执行 alarm 动作,调用 alarm 函数*/
    }
    else
    {
        /* 状态切换至锁闭状态 */
        /* 执行 lock 动作,调用 lock 函数 */
    }
}


//改进：将struct _turnstile中的状态和事件分离--V1.1
/* 定义闸机状态类 */
typedef struct _turnstile_state_t
{
    void (*card)(void);  /* card 事件处理函数 */
    void (*pass)(void);  /* pass 事件处理函数 */
}turnstile_state_t;

/* 定义闸机类 */
typedef struct _turnstile_t
{
    turnstile_state_t *p_state;
}turnstile_t;

/* 闸机状态类实例 */
turnstile_state_t locked_state = {locked_card,locked_pass};
turnstile_state_t unlocked_state = {unlocked_card,unlocked_pass};

/***********************-------------------------*/
/* 定义一个闸机类实例 */
turnstile_t turnstile;

/* 初始化闸机类实例 */
void turnstile_init(turnstile_t *p_this)
{
    p_this->p_state = &locked_state;
}